package cc.rengu.igas.bsps.core.service.trans;

import cc.rengu.igas.bsps.common.dao.BspsManagerInfoMapper;
import cc.rengu.igas.bsps.common.dao.BspsMchntBaseInfoMapper;
import cc.rengu.igas.bsps.common.dao.BspsPlatformMchntInfoMapper;
import cc.rengu.igas.bsps.common.dao.impl.BspsManagerInfoMapperImpl;
import cc.rengu.igas.bsps.common.dao.impl.BspsMchntBaseInfoMapperImpl;
import cc.rengu.igas.bsps.common.dao.impl.BspsPlatformMchntInfoMapperImpl;
import cc.rengu.igas.bsps.common.entity.ManagerInfo;
import cc.rengu.igas.bsps.common.entity.MchntBaseInfo;
import cc.rengu.igas.bsps.common.entity.PlatformMchntInfo;
import cc.rengu.igas.bsps.common.enums.RespCodeEnum;
import cc.rengu.igas.bsps.common.enums.RoleTypeEnum;
import cc.rengu.igas.bsps.core.service.base.BankManagerService;
import cc.rengu.igas.bsps.facade.bean.ExpandMchntStatisInfoBean;
import cc.rengu.igas.bsps.facade.request.ExpandMchntStatisInfoQueryRequest;
import cc.rengu.igas.bsps.facade.response.ExpandMchntStatisInfoQueryResponse;
import cc.rengu.oltp.service.common.constant.AppParamConstant;
import cc.rengu.oltp.service.model.BizException;
import cc.rengu.oltp.service.model.BizResponse;
import cc.rengu.oltp.utility.bean.PageInfo;
import cc.rengu.oltp.utility.bean.PageResult;
import cc.rengu.oltp.utility.util.ConvertUtil;
import cc.rengu.oltp.utility.util.StringUtil;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 拓展商户统计信息查询
 * Created by 王成 on 2020/3/25
 */
public class ExpandMchntStatisInfoQueryService extends BankManagerService {
    @Override
    protected Object bizBeforeCust() throws Exception {
        ExpandMchntStatisInfoQueryRequest expandMchntStatisInfoQueryRequest = new ExpandMchntStatisInfoQueryRequest();
        ConvertUtil.convertOutput(expandMchntStatisInfoQueryRequest);
        return expandMchntStatisInfoQueryRequest;
    }

    @Override
    protected BizResponse bizProcessCust(Object request) throws Exception {
        ExpandMchntStatisInfoQueryRequest expandMchntStatisInfoQueryRequest = (ExpandMchntStatisInfoQueryRequest) request;
        ExpandMchntStatisInfoQueryResponse expandMchntStatisInfoQueryResponse = new ExpandMchntStatisInfoQueryResponse();
        String instId = expandMchntStatisInfoQueryRequest.getHeader().getInstId();
        String userId = expandMchntStatisInfoQueryRequest.getUserId();
        String queryType = expandMchntStatisInfoQueryRequest.getQueryType();
        String queryId = expandMchntStatisInfoQueryRequest.getQueryId();
        String startDate = expandMchntStatisInfoQueryRequest.getStartDate();
        String endDate = expandMchntStatisInfoQueryRequest.getEndDate();
        rglog.info("必填性校验");
        /* 参数合法性校验 */
        if (StringUtil.isEmptyOrNull(userId) || StringUtil.isEmptyOrNull(queryType) || StringUtil.isEmptyOrNull(queryId)) {
            rglog.error("用户编号<{}>,查询类型<{}>,查询主体<{}>,开始日期<{}>,截止日期<{}>不能为空!", userId, queryType, queryId);
            throw new BizException(RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespCode(), RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespDesc());
        }
        /* 根据查询类型查询商户信息 */
        List<ExpandMchntStatisInfoBean> expandMchntStatisInfos = new ArrayList<>();
        BspsManagerInfoMapper bspsManagerInfoMapper = new BspsManagerInfoMapperImpl();
        if (queryType.equals(RoleTypeEnum.AGENT_MCHNT.getRoleType())) {
            PageInfo pageInfo = new PageInfo();
            pageInfo.setPageSize(expandMchntStatisInfoQueryRequest.getPageSize());
            pageInfo.setPageIndex(expandMchntStatisInfoQueryRequest.getPageIndex());
            PageResult pageResult = bspsManagerInfoMapper.selectBspsManagerIdByAgentNoPage(instId, queryId, pageInfo);
            if (null == pageResult || CollectionUtils.isEmpty(pageResult.getResult())) {
                expandMchntStatisInfoQueryResponse.setTotalPage(0);
                expandMchntStatisInfoQueryResponse.setTotalRows(0);
            } else {
                List<ManagerInfo> managerIdList = pageResult.getResult().stream().map(item -> (ManagerInfo) item).collect(Collectors.toList());
                if (!CollectionUtils.isEmpty(managerIdList)) {
                    for (ManagerInfo managerInfo : managerIdList) {
                        convExpandMchntStatisInfo(instId, managerInfo.getManagerId(), expandMchntStatisInfos, startDate, endDate, true);
                    }
                }
                expandMchntStatisInfoQueryResponse.setTotalRows(pageResult.getPageInfo().getTotalRows());
                expandMchntStatisInfoQueryResponse.setTotalPage(pageResult.getPageInfo().getTotalPage());
                expandMchntStatisInfoQueryResponse.setPageIndex(pageResult.getPageInfo().getPageIndex());
                expandMchntStatisInfoQueryResponse.setPageSize(pageResult.getPageInfo().getPageSize());
            }
        } else if (RoleTypeEnum.MANAGER.getRoleType().equals(queryType)) {
            convExpandMchntStatisInfo(instId, queryId, expandMchntStatisInfos, startDate, endDate, false);
        } else if (RoleTypeEnum.PLAT_MCHNT.getRoleType().equals(queryType)) {
            convExpandMchntStatisInfoByPlat(instId, queryId, expandMchntStatisInfos, startDate, endDate);
        } else {
            rglog.error("非法操作，不支持的操作类型:<{}>", expandMchntStatisInfoQueryRequest.getQueryType());
            throw new BizException(RespCodeEnum.ILLEGAL_OPERATION.getRespCode(), RespCodeEnum.ILLEGAL_OPERATION.getRespDesc());
        }
        /* 组装应答报文 */
        BizResponse<ExpandMchntStatisInfoQueryResponse> bizResponse = new BizResponse<>();
        expandMchntStatisInfoQueryResponse.setExpandMchntStatisInfoList(expandMchntStatisInfos);
        bizResponse.setRspSysId(AppParamConstant.SYS_ID);
        bizResponse.setRespCode(RespCodeEnum.TRANS_SUCCESS.getRespCode());
        bizResponse.setRespDesc(RespCodeEnum.TRANS_SUCCESS.getRespDesc());
        bizResponse.setResult(expandMchntStatisInfoQueryResponse);
        return bizResponse;
    }

    @Override
    protected void bizAfterCust(Object response) throws Exception {
        BizResponse bizResponse = (BizResponse) response;
        ExpandMchntStatisInfoQueryResponse expandMchntStatisInfoQueryResponse = (ExpandMchntStatisInfoQueryResponse) bizResponse.getResult();
        ConvertUtil.convertInput(expandMchntStatisInfoQueryResponse);
    }

    /**
     * 根据统计主体统计累计及当期拓展商户信息
     *
     * @param instId    法人行号
     * @param managerId 拓展经理工号
     */
    private void convExpandMchntStatisInfo(String instId, String managerId, List<ExpandMchntStatisInfoBean> expandMchntStatisInfos, String startDate, String endDate, boolean dateFlag) throws Exception {
        BspsMchntBaseInfoMapper mchntBaseInfoMapper = new BspsMchntBaseInfoMapperImpl();
        BspsManagerInfoMapper bspsManagerInfoMapper = new BspsManagerInfoMapperImpl();
        ExpandMchntStatisInfoBean expandMchntStatisInfo = new ExpandMchntStatisInfoBean();
        ManagerInfo managerInfo = bspsManagerInfoMapper.selectBspsManagerInfoByManagerId(instId, managerId);
        if (null != managerInfo && !StringUtil.isEmptyOrNull(managerInfo.getManagerName())) {
            expandMchntStatisInfo.setStatisName(managerInfo.getManagerName());
        }
        List<MchntBaseInfo> mchntBaseInfoList;
        if (dateFlag) {
            rglog.info("拓展经理按日期查询");
            //拓展经理按日期查询
            mchntBaseInfoList = mchntBaseInfoMapper.selectBspsMchntBaseInfoGroupByManagerIdAndDate(instId, managerId, startDate, endDate);
        } else {
            rglog.info("拓展经理按月查询");
            //拓展经理按月查询
            mchntBaseInfoList = mchntBaseInfoMapper.selectBspsMchntBaseInfoGroupByManagerId(instId, managerId, null);
        }
        //拓展经理查询有且仅有两条数据
        if (!CollectionUtils.isEmpty(mchntBaseInfoList) && mchntBaseInfoList.size() == 2) {
            expandMchntStatisInfo.setStatisId(managerId);
            for (MchntBaseInfo mchntBaseInfo : mchntBaseInfoList) {
                if ("ALL".equals(mchntBaseInfo.getRemark2())) {
                    expandMchntStatisInfo.setExpandTotalMchntNum(Integer.parseInt(mchntBaseInfo.getRemark1()));
                } else if ("MONTH".equals(mchntBaseInfo.getRemark2())) {
                    expandMchntStatisInfo.setExpandMchntNum(Integer.parseInt(mchntBaseInfo.getRemark1()));
                }
            }
            expandMchntStatisInfos.add(expandMchntStatisInfo);
        }
    }

    /**
     * 平台商户查询拓展商户信息
     *
     * @param instId                 法人行号
     * @param queryId                查询主体 平台商户号
     * @param expandMchntStatisInfos 统计信息
     * @param startDate              开始日期
     * @param endDate                截止日期
     */
    private void convExpandMchntStatisInfoByPlat(String instId, String queryId, List<ExpandMchntStatisInfoBean> expandMchntStatisInfos, String startDate, String endDate) throws Exception {
        BspsMchntBaseInfoMapper mchntBaseInfoMapper = new BspsMchntBaseInfoMapperImpl();
        BspsPlatformMchntInfoMapper platformMchntInfoMapper = new BspsPlatformMchntInfoMapperImpl();
        PlatformMchntInfo platformMchntInfo = platformMchntInfoMapper.selectBspsPlatformMchntInfoByInstIdAndMchntNo(instId, queryId);
        ExpandMchntStatisInfoBean expandMchntStatisInfo = new ExpandMchntStatisInfoBean();
        if (null != platformMchntInfo && !StringUtil.isEmptyOrNull(platformMchntInfo.getPlatMchntName())) {
            expandMchntStatisInfo.setStatisName(platformMchntInfo.getPlatMchntName());
        }
        rglog.info("平台商户查询商户统计信息");
        List<MchntBaseInfo> mchntBaseInfoList = mchntBaseInfoMapper.selectBspsMchntBaseInfoGroupByPlatMchntNo(instId, queryId, startDate, endDate);
        if (!CollectionUtils.isEmpty(mchntBaseInfoList) && mchntBaseInfoList.size() == 2) {
            expandMchntStatisInfo.setStatisId(queryId);
            for (MchntBaseInfo mchntBaseInfo : mchntBaseInfoList) {
                if ("ALL".equals(mchntBaseInfo.getRemark2())) {
                    expandMchntStatisInfo.setExpandTotalMchntNum(Integer.parseInt(mchntBaseInfo.getRemark1()));
                } else if ("MONTH".equals(mchntBaseInfo.getRemark2())) {
                    expandMchntStatisInfo.setExpandMchntNum(Integer.parseInt(mchntBaseInfo.getRemark1()));
                }
            }
            expandMchntStatisInfos.add(expandMchntStatisInfo);
        }
    }
}
